#!/usr/bin/env python3
# -*- coding: utf-8 -*-
##############################################
# @Author: DengLibin 榆霖
# @Date: Create in 2022-03-17 14:39:53
# @Description: 
##############################################

import numpy as np
#加载数据
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score


def run():
    df = pd.read_csv('usa_housing_price.csv')
    print("df_shape", df.shape)
    print(df.head())
    (fig, axes) = plt.subplots(nrows=2, ncols=3, figsize=(20, 8), dpi=80)
    ##############################################################################################################
    # 收入-价格
    income_x = df.loc[:, 'Avg. Area Income']
    print("incom_x_shape", income_x.shape)
    
    y = df.loc[:,  'Price']
    axes[0][0].scatter(income_x, y)
    # 设置x,y轴刻度
    axes[0][0].set_xticks([x * 20000 for x in range(7)])
    axes[0][0].set_yticks([x * 200000 for x in range(10)])
    axes[0][0].set_xlabel('Income')
    axes[0][0].set_ylabel('Price')
    
    ##############################################################################################################
    # 年龄-价格
    age_x = df.loc[:, 'Avg. Area House Age']
    axes[0][1].scatter(age_x, y)
    # 设置x,y轴刻度
    axes[0][1].set_xticks([x for x in range(10)])
    axes[0][1].set_yticks([x * 200000 for x in range(10)])
    axes[0][1].set_xlabel('Age')
    axes[0][1].set_ylabel('Price')
    
    ##############################################################################################################
    # 房间数-价格
    rooms_x = df.loc[:, 'Avg. Area Number of Rooms']
    axes[0][2].scatter(rooms_x, y)
    # 设置x,y轴刻度
    axes[0][2].set_xticks([x for x in range(10)])
    axes[0][2].set_yticks([x * 200000 for x in range(10)])
    axes[0][2].set_xlabel('Rooms')
    axes[0][2].set_ylabel('Price')
    
    ##############################################################################################################
    # 地区人口数-价格
    population_x = df.loc[:, 'Area Population']
    axes[1][0].scatter(population_x, y)
    # 设x,y轴刻度
    axes[1][0].set_xticks([x*10000 for x in range(10)])
    axes[1][0].set_yticks([x * 200000 for x in range(10)])
    axes[1][0].set_xlabel('Population')
    axes[1][0].set_ylabel('Price')
    
    ##############################################################################################################
     # 大小-价格
    size_x = df.loc[:, 'size']
    axes[1][1].scatter(size_x, y)
    # 设x,y轴刻度
    axes[1][1].set_xticks([x * 50 for x in range(8)])
    axes[1][1].set_yticks([x * 200000 for x in range(10)])
    axes[1][1].set_xlabel('Size')
    axes[1][1].set_ylabel('Price')
    
    ###################################################单因子线性模型###########################################################
    # 模型训练和预测 (size 和 price)
    LR1 = LinearRegression()
    # 转成二维
    size_x = np.array(size_x).reshape(-1, 1)
    y = np.array(y).reshape(-1, 1)
    print("y_shape", y.shape)
    # 训练模型
    LR1.fit(size_x, y)
    # 根据x预测y
    y_predict_1 = LR1.predict(size_x)
    
    # 评估模型
    # MSE 均方误差 越接近0越好，模型越准确
    MSE = mean_squared_error(y, y_predict_1)
    print('MSE', MSE)
    # r方 越接近1越好
    R2 = r2_score(y, y_predict_1)
    print('R2', R2)
    
    # 折线图
    axes[1][1].plot(size_x, y_predict_1, 'r')
    
    #########################################################多因子线性模型#####################################################
    x_multi = df.drop(['Price'], axis=1)
    print("x_multi_shape", x_multi.shape)
    LR_multi = LinearRegression()
    # 训练
    LR_multi.fit(x_multi, y)
    # 预测
    y_predict_multi = LR_multi.predict(x_multi)
    
     # 评估模型
    # MSE 均方误差 越接近0越好，模型越准确
    MSE = mean_squared_error(y, y_predict_multi)
    print('MSE', MSE)
    # r方 越接近1越好
    R2 = r2_score(y, y_predict_multi)
    print('R2', R2)
    
    # 真实值和预测值
    axes[1][2].scatter(y, y_predict_multi)
    # 设x,y轴刻度
    axes[1][2].set_xticks([x * 200000 for x in range(10)])
    axes[1][2].set_yticks([x * 200000 for x in range(10)])
    axes[1][2].set_xlabel('Real Price')
    axes[1][2].set_ylabel('Predict Price')
    
    
    #########################################################使用多因子模型预测#####################################################
    x_test = [65000, 5, 5, 30000, 200]
    x_test = np.array(x_test).reshape(1, -1)   
    y_test_predict = LR_multi.predict(x_test)
    print(y_test_predict) 
    
    plt.show()
    
   

if __name__ == '__main__':
   run()
